home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / tutorials / geometer / io.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  5.3 KB  |  198 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. #include "parse.h"
  19. #include <ctype.h>
  20. #include <string.h>
  21. #include <gl.h>
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24.  
  25. extern primitive *plist;
  26. extern long layerset;
  27.  
  28. char *commenttitle()
  29. {
  30.     static char tempbuf[256];
  31.     char *sptr, *dptr;
  32.  
  33.     for (primitive *p = plist; p; p = p->next) {
  34.     if (p->ptype == _text) {
  35.         sptr = ((comment *)p)->str;
  36.         dptr = tempbuf;
  37.         while(*sptr) {
  38.         if(isalnum(*sptr) || isspace(*sptr) || *sptr == '\''
  39.             || *sptr == '-')
  40.             *dptr++ = *sptr;
  41.         sptr++;
  42.         }
  43.         *dptr=0;
  44.         return tempbuf;
  45.     }
  46.     }
  47.     return (char *)0;
  48. }
  49.  
  50. #define XTRANS    (306)
  51. #define YTRANS    (469)
  52. #define PDELTA    (252)
  53. #define FONTNAME "Times-Italic"
  54. #define oFONTNAME "ZapfChancery-MediumItalic"
  55.  
  56. void setPScolor(long c, FILE *fp)
  57. {
  58.     switch (c) {
  59.     case 0:
  60.         fprintf(fp, "1 1 1 setrgbcolor\n"); break;
  61.     case 1:
  62.         fprintf(fp, "1 0 0 setrgbcolor\n"); break;
  63.     case 2:
  64.         fprintf(fp, "0 1 0 setrgbcolor\n"); break;
  65.     case 3:
  66.         fprintf(fp, "1 1 0 setrgbcolor\n"); break;
  67.     case 4:
  68.         fprintf(fp, "0 0 1 setrgbcolor\n"); break;
  69.     case 5:
  70.         fprintf(fp, "1 0 1 setrgbcolor\n"); break;
  71.     case 6:
  72.         fprintf(fp, "0 1 1 setrgbcolor\n"); break;
  73.     case 7:
  74.         fprintf(fp, "0 0 0 setrgbcolor\n"); break;
  75.     default:
  76.         fprintf(fp, "0 0 0 setrgbcolor\n"); break;
  77.     }
  78. }
  79.  
  80. long EPS = 0;
  81.  
  82. long dumpPostScript(char *filename)
  83. {
  84.     float ym = 0.0;
  85.     FILE *fp;
  86.     char *comment;
  87.     char str[100];
  88.  
  89.     if (EPS == 1) filename = "geom.ps";
  90.     mode_t omask = umask(0);
  91.     fp = fopen(filename, "w");
  92.     umask(omask);
  93.     if (fp == 0) {
  94.     sprintf(str, "Couldn't open %s", filename);
  95.     displaymessage(str);
  96.     return 0;
  97.     }
  98.     fprintf(fp,"%%!PS-Adobe-2.0 EPSF-1.2\n");
  99.     fprintf(fp,"%%%%Creator: tops on IRIS workstation\n");
  100.     fprintf(fp,"%%%%BoundingBox: %d %d %d %d\n",306-PDELTA,YTRANS-PDELTA,306+PDELTA,YTRANS+PDELTA);
  101.     fprintf(fp,"%%%%EndComments\n");
  102.     fprintf(fp, "0 setlinewidth\n");
  103.     fprintf(fp, "%d %d translate\n",XTRANS,YTRANS);
  104.     fprintf(fp, "%d %d scale\n",PDELTA,PDELTA);
  105.     fprintf(fp,"/haloshow {\n");
  106.     fprintf(fp,"gsave\n");
  107.     fprintf(fp,"0.010 setlinewidth\n");
  108.     fprintf(fp,"1 setlinecap\n");
  109.     fprintf(fp,"1 setlinejoin\n");
  110.     fprintf(fp,"currentrgbcolor\n");
  111.     fprintf(fp,"/bval exch store /gval exch store /rval exch store\n");
  112.     fprintf(fp,"1 setgray\n");
  113.     fprintf(fp,"gsave\n");
  114.     fprintf(fp,"dup false charpath stroke\n");
  115.     fprintf(fp,"grestore\n");
  116.     fprintf(fp,"gsave\n");
  117.     fprintf(fp,"dup show\n");
  118.     fprintf(fp,"grestore\n");
  119.     fprintf(fp,"rval gval bval setrgbcolor show\n");
  120.     fprintf(fp,"grestore\n");
  121.     fprintf(fp,"} def\n");
  122.     fprintf(fp, "/centershow {\n");
  123.     fprintf(fp, "dup\n");
  124.     fprintf(fp, "stringwidth pop -2 div 0 rmoveto\n");
  125.     fprintf(fp, "haloshow\n");
  126.     fprintf(fp, "} def\n");
  127.     comment = commenttitle();
  128.     if(comment) {
  129.     fprintf(fp, "/%s findfont .084 scalefont setfont\n",FONTNAME);
  130.     fprintf(fp, "0.0 -1.2 moveto (%s) centershow\n",comment);
  131.     }
  132.     fprintf(fp, "-1 -1 moveto -1 1 lineto 1 1 lineto 1 -1 lineto\n");
  133.     fprintf(fp, "closepath clip\n");
  134.     fprintf(fp, "/%s findfont .060 scalefont setfont\n",FONTNAME);
  135.     for (primitive *p = plist; p; p = p->next) {
  136.         setPScolor(p->Color, fp);
  137.         if (layerset & p->layers) switch (p->ptype) {
  138.         case _vertex:
  139.             break;
  140.         case _line:
  141.             ((line *)p)->PostScript(fp); break;
  142.         case _circle:
  143.             ((circle *)p)->PostScript(fp); break;
  144.         case _bezier:
  145.             ((bezier *)p)->PostScript(fp); break;
  146.         case _length:
  147.             if (p->name[0] == 0) break;
  148.             fprintf(fp, "-0.99 %f moveto\n", ym);
  149.         ym -= 2.3*pbsize;
  150.         ((length *)p)->PostScript(fp);
  151.         break;
  152.         case _conic:
  153.             ((conic *)p)->PostScript(fp); break;
  154.         case _text:
  155.             break;
  156.     }
  157.     }
  158.     for (p = plist; p; p = p->next) {
  159.         setPScolor(p->Color, fp);
  160.     if (p->ptype == _vertex && (layerset & p->layers))
  161.         ((vertex *)p)->PostScript(fp);
  162.     }
  163.     fprintf(fp, "showpage\n");
  164.     fclose(fp);
  165.     if (EPS == 0) {
  166.     sprintf(str, "lp -c %s; rm %s", filename, filename);
  167.     system(str);
  168.     }
  169.     return 1;
  170. }
  171.  
  172. long readgeometry(char *filename)
  173. {
  174.     FILE *fp;
  175.     char str[100];
  176.     if (0 == (fp = fopen(filename, "r"))) {
  177.         sprintf(str, "Couldn't open %s", filename);
  178.     displaymessage(str);
  179.     return 0;
  180.     }
  181.     return parsefile(fp);
  182. }
  183.  
  184. #include <time.h>
  185.  
  186. char *suffix = 0;
  187.  
  188. long insertgeometry(char *filename)
  189. {
  190.     char insertprefix[15];
  191.     long i = (long)time(0);
  192.     sprintf(insertprefix, "__%x", (i&0x7ffff8)>>3);
  193.     suffix = insertprefix;
  194.     long ret = readgeometry(filename);
  195.     suffix = (char *)0;
  196.     return ret;
  197. }
  198.